package administracion;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import dao.CajeroDAO;
import dao.EmpleadoDAO;
import dao.FacturaDAO;
import dao.MesaDAO;
import dao.MozoDAO;
import dao.PlatoDAO;
import dto.CajeroDTO;
import dto.ComandaDTO;
import dto.EmpleadoDTO;
import dto.FacturaDTO;
import dto.ItemComandaDTO;
import dto.ItemFacturaDTO;
import dto.MesaDTO;
import dto.PlatoDTO;
import entity.Cajero;
import entity.Comanda;
import entity.Empleado;
import entity.Factura;
import entity.ItemComanda;
import entity.ItemFactura;
import entity.Liquidacion;
import entity.Mesa;
import entity.Mozo;
import entity.Plato;

public class FacturaManager {

	private static FacturaManager instancia;
	private FacturaDAO dao = FacturaDAO.getInstancia();
		
	public FacturaManager() {
		super();
	}
		
	public static FacturaManager getInstancia(){
		if(instancia == null)
			instancia = new FacturaManager();
		return instancia;
	}
	
	public FacturaDTO altaFactura(MesaDTO m, CajeroDTO ca) throws RemoteException {
		Cajero caj =CajeroDAO.getInstancia().buscarCajeroCodigo(ca.getLegajo());
		Mesa mes= MesaDAO.getInstancia().buscarMesa(m.getIdMesa());
		Factura f=new Factura();
		f.setEmpleado(caj);
		f.setMesa(mes);
		f.setFecha(new Date());
		//genero un item factura por cada item comanda.
		List<ItemFactura> itemN=new ArrayList<ItemFactura>();
		
		float total=0;
		for(ItemComanda i: mes.getComanda().getItems()){
			ItemFactura it = new ItemFactura();
			it.setCantidad(i.getCantidad());
			it.setPrecio(i.getPlato().getPrecio()*it.getCantidad());
			it.setProducto(i.getPlato());
			itemN.add(it);
			total=total+it.getPrecio();
		}
		f.setTotal(total);
		f.setItems(itemN);
		FacturaDAO.getInstancia().altaFactura(f);
		FacturaDTO fact= new FacturaDTO();
		fact.setEmpleado(ca);
		fact.setFecha(f.getFecha());
		fact.setMesa(f.getMesa().getDTO());
		fact.setNumero(f.getNumero());
		fact.setTotal(f.getTotal());
		List<ItemFactura> item=new ArrayList<ItemFactura>();
		item=f.getItems();
		List<ItemFacturaDTO> itemsDTO=new ArrayList<ItemFacturaDTO>();
		for (ItemFactura i: item){
			ItemFacturaDTO itemDTO=new ItemFacturaDTO();
			itemDTO.setCantidad(i.getCantidad());
			i.setDescuento(0);
			itemDTO.setId(i.getId());
			itemDTO.setPrecio(i.getPrecio());
			itemDTO.setProducto(i.getProducto().getDTO());
			itemsDTO.add(itemDTO);
		}
		fact.setItems(itemsDTO);
		FacturaDAO.getInstancia().altaFactura(f);
		return fact;
	}
	
	
	public FacturaDTO confirmarFactura(FacturaDTO factura){
		Factura f =FacturaDAO.getInstancia().buscarFactura(factura.getNumero());
		f.setFecha(new Date());
		List <ItemFactura> items = f.getItems();
		float comision=0;
		float total=0;
		for(ItemFactura i: items){
			i.setPrecio(i.getCantidad()*(1-i.getDescuento())*i.getProducto().getPrecio());
			comision=comision+i.getPrecio()*i.getProducto().getComision();
			total=total+i.getPrecio();
		}
		//actualizo el total de la factura
		f.setTotal(total);
		
		//genero la liqui
		Liquidacion l=new Liquidacion();
		l.setMonto(comision);
		l.setFecha(new Date());
		
		//persistir esto
		FacturaDAO.getInstancia().updateFactura(f);
		FacturaDAO.getInstancia().altaLiquidacion(l);
		
		
		
		//busco el mozo
		Mozo m= f.getMesa().getComanda().getMozo();
		List<Liquidacion> liqui= new ArrayList<Liquidacion>();
		liqui = m.getLiquidaciones();
		liqui.add(l);
		m.setLiquidaciones(liqui);
		MozoDAO.getInstancia().updateMozo(m);
		
		dao.updateFactura(f);
		
		//devuelvo una factura DTO
		FacturaDTO fact= new FacturaDTO();
		fact.setEmpleado((CajeroDTO) f.getEmpleado().getDTO());
		fact.setFecha(f.getFecha());
		fact.setMesa(f.getMesa().getDTO());
		fact.setNumero(f.getNumero());
		fact.setTotal(f.getTotal());
		List<ItemFactura> item=new ArrayList<ItemFactura>();
		item=f.getItems();
		List<ItemFacturaDTO> itemsDTO=new ArrayList<ItemFacturaDTO>();
		for (ItemFactura i: item){
			ItemFacturaDTO itemDTO=new ItemFacturaDTO();
			itemDTO.setCantidad(i.getCantidad());
			i.setDescuento(0);
			itemDTO.setId(i.getId());
			itemDTO.setPrecio(i.getPrecio());
			itemDTO.setProducto(i.getProducto().getDTO());
			itemsDTO.add(itemDTO);
		}
		fact.setItems(itemsDTO);
		FacturaDAO.getInstancia().altaFactura(f);
		return fact;
		
		 
	}
//	//tengo que por cada dto actualizar su entity.
//	//no se como hacer para actualizar desde los dtos a los entitys de item factura que son los que tienen el dto.
//	public void actualizarFactura(FacturaDTO factura){
//		Factura f =FacturaDAO.getInstancia().buscarFactura(factura.getNumero());
//		List <ItemFacturaDTO> itemsDTO =factura.getItems();
//		
//		
//		float comision=0;
//		float total=0;
//		
//		factura.getItems();
//		
//		
//		//actualizo el total de la factura ojo que esta en cero 
//		f.setTotal(total);
//		dao.updateFactura(f);
//		 
//	}
//	
//	private Comanda buscarFacturaId(int numero) {
//		// TODO Auto-generated method stub
//		return null;
//	}

}
